!(typeof define !== "function" ? function ($) { $(null, typeof exports !== 'undefined' ? exports : window); } : define)(function (require, exports) {

    "use strict";
    var obj = Object.create(Object.prototype, {
        newInstance: {
            value: function create() {
                var object = Object.create(this);
                object.initialize.apply(object, arguments);
                return object;
            }
        },
        initialize: {
            value: function initialize() {
            }
        },
        merge: {
            value: function merge() {
                var descriptor = {};
                Array.prototype.forEach.call(arguments, function (properties) {
                    Object.getOwnPropertyNames(properties).forEach(function (name) {
                        descriptor[name] = Object.getOwnPropertyDescriptor(properties, name);
                    });
                });
                Object.defineProperties(this, descriptor);
                return this;
            }
        },
        extend: {
            value: function extend() {
                var o = this.merge.apply(Object.create(this), arguments);
                if (Object.freeze) return Object.freeze(o);
                else if (Object.seal) return Object.seal(o);
                else return o;
            }
        }
    });

    if (Object.freeze)
        exports.Base = Object.freeze(obj);
    else if (Object.seal)
        exports.Base = Object.seal(obj);
    else
        exports.Base = obj;
});
